package generics;

/**
 * 泛型的使用
 */
public class Demo {
    public static void main(String[] args) {
        //在使用时若不指定泛型，则默认为原型"Object"
        TransferObject to = new TransferObject();
        to.setReceiver("范传奇");
        to.setSender("王克晶");
        to.setData("你好!");//setData(T data),这里T就是Object
        to.setData(123);//什么类型元素都可以存入(基本类型会自动装箱)

        //T编译器认为应当是String
        TransferObject<String> to1 = new TransferObject<>();
        to1.setData("嘿嘿");//相当于setData(String data)
//        to1.setData(123);//编译器会检查实参类型，不匹配时编译不通过

        //泛型只能是引用类型，基本类型要指定对应的包装类
        TransferObject<Integer> to2 = new TransferObject<>();
        to2.setData(123);

        /*
            不指定泛型时，由于为原型Object，因此获取时只能以Object形式接受返回值
            需要时要自行造型。但是会存在风险，如果实际返回类型与造型不一致会报错
         */
        int obj = (Integer)to.getData();//需要自行造型

        //T getData() 由于t1的泛型为String，因此getData可以直接以String接收
        String data = to1.getData();//编译器会补充造型代码，因此无需显示的造型
//        Integer re = to1.getData();//编译器检查接收返回值的类型，不匹配编译不通过

        Integer i = to2.getData();//编译器会自动造型为Integer

    }
}





